/*
 * Copyright (c) 2018-2999 湖南洛云网络科技有限公司 All rights reserved.
 *
 * https://www.gz-yami.com/
 *
 */

package com.yami.shop.im.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yami.shop.bean.model.ShopDetail;
import com.yami.shop.bean.model.User;
import com.yami.shop.im.bean.ImMsgBizUserHistory;
import com.yami.shop.im.bo.ShopSessionInfo;
import com.yami.shop.im.bo.SysSessionInfo;
import com.yami.shop.im.bo.UserSessionInfo;
import com.yami.shop.im.param.MessageInfo;
import com.yami.shop.im.vo.MsgItem;
import com.yami.shop.security.multishop.model.YamiShopUser;
import com.yami.shop.security.platform.model.YamiSysUser;
import com.yami.shop.sys.comment.model.SysUser;

import java.util.List;
import java.util.Map;

/**
 * @author LZK
 * @date 2021-04-01 17:22:48
 */
public interface ImMsgBizUserHistoryService extends IService<ImMsgBizUserHistory> {

    /**
     * 保存聊天记录
     *
     * @param sendType   聊天类型
     * @param bizId      平台或店铺id
     * @param userId     用户id
     * @param employeeId 员工id
     * @param type       消息类型
     * @param content    消息呢容
     * @param whoSend    发送人
     * @return 消息历史记录实体类
     */
    ImMsgBizUserHistory saveHistory(Integer sendType, Long bizId, String userId, Long employeeId, Integer type, String content, Integer whoSend);

    /**
     * 转换消息实体类
     *
     * @param sysSessionInfo      平台信息
     * @param userSessionInfo     用户信息
     * @param imMsgBizUserHistory 消息历史记录
     * @return 消息转换输出类
     */
    MsgItem getUserPlatformMsgItem(SysSessionInfo sysSessionInfo, UserSessionInfo userSessionInfo, ImMsgBizUserHistory imMsgBizUserHistory);

    /**
     * 转换消息实体类
     *
     * @param shopSessionInfo     商家信息
     * @param userSessionInfo     用户信息
     * @param imMsgBizUserHistory 消息历史记录
     * @return 消息转换输出类
     */
    MsgItem getUserShopMsgItem(ShopSessionInfo shopSessionInfo, UserSessionInfo userSessionInfo, ImMsgBizUserHistory imMsgBizUserHistory);

    /**
     * 获取用户与平台的聊天记录
     *
     * @param sysUser         平台信息
     * @param messageInfo     信息载体
     * @param bizId           平台或店铺id
     * @param userId          用户id
     * @param userSessionInfo 用户信息
     * @return 翻页聊天记录
     */
    Page<MsgItem> getUserPlatformHistory(SysUser sysUser, MessageInfo messageInfo, Long bizId, String userId, UserSessionInfo userSessionInfo);

    /**
     * 获取用户与商家的聊天记录
     *
     * @param shopDetail      商家信息
     * @param messageInfo     信息载体
     * @param bizId           平台或店铺id
     * @param userId          用户id
     * @param userSessionInfo 用户信息
     * @return 翻页聊天记录
     */
    Page<MsgItem> getUserShopHistory(ShopDetail shopDetail, MessageInfo messageInfo, Long bizId, String userId, UserSessionInfo userSessionInfo);

    /**
     * 获取商家与用户的聊天记录
     *
     * @param shopUser    商家信息
     * @param messageInfo 信息载体
     * @param user        用户信息
     * @return 翻页聊天记录
     */
    Page<MsgItem> getShopUserHistory(YamiShopUser shopUser, MessageInfo messageInfo, User user);

    /**
     * 获取平台与用户的聊天记录
     *
     * @param sysUser     平台信息
     * @param messageInfo 信息载体
     * @param user        用户信息
     * @return 翻页聊天记录
     */
    Page<MsgItem> getPlatformUserHistory(YamiSysUser sysUser, MessageInfo messageInfo, User user);

    /**
     * 用户标记已读
     *
     * @param messageInfo 信息载体
     * @param bizId       平台或店铺id
     * @param userId      用户id
     * @return 消息历史记录实体类列表
     */
    List<ImMsgBizUserHistory> markUserPlatformRead(MessageInfo messageInfo, Long bizId, String userId);

    /**
     * 用户标记已读
     *
     * @param messageInfo 信息载体
     * @param bizId       平台或店铺id
     * @param userId      用户id
     * @return 消息历史记录实体类列表
     */
    List<ImMsgBizUserHistory> markUserShopRead(MessageInfo messageInfo, Long bizId, String userId);

    /**
     * 商家标记已读
     *
     * @param messageInfo 信息载体
     * @param shopUser    商家信息
     * @param userId      用户id
     * @return 消息历史记录实体类列表
     */
    List<ImMsgBizUserHistory> markShopUserRead(MessageInfo messageInfo, YamiShopUser shopUser, String userId);

    /**
     * 平台标记已读
     *
     * @param messageInfo 信息载体
     * @param sysUser     平台信息
     * @param userId      用户id
     * @return 消息历史记录实体类列表
     */
    List<ImMsgBizUserHistory> markPlatformUserRead(MessageInfo messageInfo, YamiSysUser sysUser, String userId);

    /**
     * 保存用户与平台的聊天记录
     *
     * @param messageInfo 信息载体
     * @param bizId       平台或店铺id
     * @param userId      用户id
     * @return 消息历史记录实体类
     */
    ImMsgBizUserHistory saveUserPlatformHistory(MessageInfo messageInfo, Long bizId, String userId);

    /**
     * 保存用户与商家的聊天记录
     *
     * @param messageInfo 信息载体
     * @param bizId       平台或店铺id
     * @param userId      用户id
     * @param employeeId  员工id
     * @return 消息历史记录实体类
     */
    ImMsgBizUserHistory saveUserShopHistory(MessageInfo messageInfo, Long bizId, String userId, Long employeeId);

    /**
     * 保存商家与用户的聊天记录
     *
     * @param messageInfo 信息载体
     * @param shopUser    商家信息
     * @return 消息历史记录实体类
     */
    ImMsgBizUserHistory saveShopUserHistory(MessageInfo messageInfo, YamiShopUser shopUser);

    /**
     * 保存平台与用户的聊天记录
     *
     * @param messageInfo 信息载体
     * @param sysUser     平台信息
     * @return 消息历史记录实体类
     */
    ImMsgBizUserHistory savePlatformUserHistory(MessageInfo messageInfo, YamiSysUser sysUser);

    /**
     * 平台离线自动回复
     *
     * @param messageInfo 信息载体
     * @param bizId       平台或店铺id
     * @param userId      用户id
     * @return 消息历史记录实体类
     */
    ImMsgBizUserHistory saveUserPlatformOfflineReply(MessageInfo messageInfo, Long bizId, String userId);

    /**
     * 商家离线自动回复
     *
     * @param messageInfo 信息载体
     * @param bizId       平台或店铺id
     * @param userId      用户id
     * @return 消息历史记录实体类
     */
    ImMsgBizUserHistory saveUserShopOfflineReply(MessageInfo messageInfo, Long bizId, String userId);

    /**
     * 商家首次接待自动回复
     *
     * @param messageInfo     信息载体
     * @param shopSessionInfo 商家信息
     * @param bizId           平台或店铺id
     * @param userId          用户id
     * @return 消息历史记录实体类
     */
    Map<String, ImMsgBizUserHistory> saveUserShopFirstReply(MessageInfo messageInfo, ShopSessionInfo shopSessionInfo, Long bizId, String userId);

    /**
     * 商家切换客服系统提醒
     *
     * @param shopUser        商家信息
     * @param shopSessionInfo 商家信息
     * @param userSessionInfo 用户信息
     * @return 消息历史记录实体类
     */
    ImMsgBizUserHistory saveShopChangeEmployeeReply(YamiShopUser shopUser, ShopSessionInfo shopSessionInfo, UserSessionInfo userSessionInfo);

}
